home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d966.lha / UChessSrc / UChessSrc.lha / init.c < prev    next >
C/C++ Source or Header  |  1994-02-08  |  18KB  |  766 lines

  1. /*
  2.  * init.c - C source for GNU CHESS
  3.  *
  4.  * Copyright (c) 1988,1989,1990 John Stanback
  5.  * Copyright (c) 1992 Free Software Foundation
  6.  *
  7.  * This file is part of GNU CHESS.
  8.  *
  9.  * GNU Chess is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2, or (at your option)
  12.  * any later version.
  13.  *
  14.  * GNU Chess is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with GNU Chess; see the file COPYING.  If not, write to
  21.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  */
  23. #include "gnuchess.h"
  24.  
  25. #ifdef AMIGA
  26. #define __USE_SYSBASE
  27. #define MOVENOWMENUNUM 0x42
  28. #define THINKMENUNUM 0x82
  29. #define SHOWMENUNUM 0xa2
  30. #define BOOKMENUNUM 0xc2
  31. #define SUPERMENUNUM 0xe2
  32. #define ADVANCEDMENUNUM 0x102
  33. #define INTERMEDIATEMENUNUM 0x122
  34. #define EASYMENUNUM 0x142
  35. #include <proto/exec.h>
  36. #include <proto/dos.h>
  37. #include <proto/intuition.h>
  38. extern int procpri;
  39. extern struct Process *myproc;
  40. extern int __far ResignOffered;
  41. #endif
  42.  
  43. extern struct Menu Menu1;
  44. #define MenuList1 Menu1
  45. extern int MenuStripSet;
  46. extern struct MenuItem MenuItem8ab;
  47. extern struct Window __aligned *wG;
  48. unsigned int urand (void);
  49.  
  50.  
  51. /* .... MOVE GENERATION VARIABLES AND INITIALIZATIONS .... */
  52.  
  53.  
  54. short __aligned PCRASH,PCENTER;
  55. extern int PlayMode;
  56. extern unsigned int TTadd;
  57.  
  58. extern short int ISZERO;
  59. extern int __aligned global_tmp_score;
  60. extern int __aligned previous_score;
  61. int __aligned FirstTime=1;
  62. extern int SupervisorMode;
  63. extern int IllegalMove;
  64. extern int CheckIllegal;
  65. #ifdef LONGINTS2
  66. INTSIZE  __far distdata[64][64];
  67. INTSIZE  __far taxidata[64][64];
  68. #else
  69. INTSIZE  __aligned distdata[64][64];
  70. INTSIZE  __aligned taxidata[64][64];
  71. #endif
  72.  
  73. #ifdef KILLT
  74. /* put moves to the center first */
  75. void
  76. Initialize_killt (void)
  77. {
  78.   REG unsigned INTSIZE f, t, s;
  79.   REG INTSIZE d;
  80.   for (f = 64; f--;)
  81.     for (t = 64; t--;)
  82.       {
  83.     d = taxidata[f][0x1b];
  84.     if (taxidata[f][0x1c] < d)
  85.       d = taxidata[f][0x1c];
  86.     if (taxidata[f][0x23] < d)
  87.       d = taxidata[f][0x23];
  88.     if (taxidata[f][0x24] < d)
  89.       d = taxidata[f][0x24];
  90.     s = d;
  91.     d = taxidata[t][0x1b];
  92.     if (taxidata[t][0x1c] < d)
  93.       d = taxidata[t][0x1c];
  94.     if (taxidata[t][0x23] < d)
  95.       d = taxidata[t][0x23];
  96.     if (taxidata[t][0x24] < d)
  97.       d = taxidata[t][0x24];
  98.     s -= d;
  99.     killt[(f << 8) | t] = s;
  100.     killt[(f << 8) | t | 0x80] = s;
  101.       }
  102. }
  103. #endif
  104. void
  105. Initialize_dist (void)
  106. {
  107.   REG INTSIZE a, b, d, di;
  108.  
  109.   for (a = 0; a < 64; a++)
  110.     for (b = 0; b < 64; b++)
  111.       {
  112.     d = abs (column (a) - column (b));
  113.     di = abs (row (a) - row (b));
  114.     taxidata[a][b] = d + di;
  115.     distdata[a][b] = (d > di ? d : di);
  116.       }
  117. #ifdef KILLT
  118.   Initialize_killt ();
  119. #endif
  120. }
  121.  
  122. const INTSIZE __aligned Stboard[64] =
  123. {rook, knight, bishop, queen, king, bishop, knight, rook,
  124.  pawn, pawn, pawn, pawn, pawn, pawn, pawn, pawn,
  125.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  126.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  127.  pawn, pawn, pawn, pawn, pawn, pawn, pawn, pawn,
  128.  rook, knight, bishop, queen, king, bishop, knight, rook};
  129. const INTSIZE __aligned Stcolor[64] =
  130. {white, white, white, white, white, white, white, white,
  131.  white, white, white, white, white, white, white, white,
  132.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  133.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  134.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  135.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  136.  black, black, black, black, black, black, black, black,
  137.  black, black, black, black, black, black, black, black};
  138. INTSIZE board[64], color[64];
  139.  
  140. /* given epsquare, from where can a pawn be taken? */
  141. const INTSIZE __aligned epmove1[64] =
  142. {0, 1, 2, 3, 4, 5, 6, 7,
  143.  8, 9, 10, 11, 12, 13, 14, 15,
  144.  16, 24, 25, 26, 27, 28, 29, 30,
  145.  24, 25, 26, 27, 28, 29, 30, 31,
  146.  32, 33, 34, 35, 36, 37, 38, 39,
  147.  40, 32, 33, 34, 35, 36, 37, 38,
  148.  48, 49, 50, 51, 52, 53, 54, 55,
  149.  56, 57, 58, 59, 60, 61, 62, 63};
  150. const INTSIZE __aligned epmove2[64] =
  151. {0, 1, 2, 3, 4, 5, 6, 7,
  152.  8, 9, 10, 11, 12, 13, 14, 15,
  153.  25, 26, 27, 28, 29, 30, 31, 23,
  154.  24, 25, 26, 27, 28, 29, 30, 31,
  155.  32, 33, 34, 35, 36, 37, 38, 39,
  156.  33, 34, 35, 36, 37, 38, 39, 47,
  157.  48, 49, 50, 51, 52, 53, 54, 55,
  158.  56, 57, 58, 59, 60, 61, 62, 63};
  159.  
  160.  
  161. /*
  162.  * nextpos[piece][from-square] , nextdir[piece][from-square] gives vector of
  163.  * positions reachable from from-square in ppos with piece such that the
  164.  * sequence    ppos = nextpos[piece][from-square]; pdir =
  165.  * nextdir[piece][from-square]; u = ppos[sq]; do { u = ppos[u]; if(color[u]
  166.  * != neutral) u = pdir[u]; } while (sq != u); will generate the sequence of
  167.  * all squares reachable from sq.
  168.  *
  169.  * If the path is blocked u = pdir[sq] will generate the continuation of the
  170.  * sequence in other directions.
  171.  */
  172.  
  173. unsigned char __far __aligned nextpos[8][64][64];
  174. unsigned char __far __aligned nextdir[8][64][64];
  175.  
  176. /*
  177.  * ptype is used to separate white and black pawns, like this; ptyp =
  178.  * ptype[side][piece] piece can be used directly in nextpos/nextdir when
  179.  * generating moves for pieces that are not black pawns.
  180.  */
  181. const INTSIZE __aligned ptype[2][8] =
  182. {
  183.   no_piece, pawn, knight, bishop, rook, queen, king, no_piece,
  184.   no_piece, bpawn, knight, bishop, rook, queen, king, no_piece};
  185.  
  186. /* data used to generate nextpos/nextdir */
  187. static const INTSIZE __aligned direc[8][8] =
  188. {
  189.   0, 0, 0, 0, 0, 0, 0, 0,
  190.   10, 9, 11, 0, 0, 0, 0, 0,
  191.   8, -8, 12, -12, 19, -19, 21, -21,
  192.   9, 11, -9, -11, 0, 0, 0, 0,
  193.   1, 10, -1, -10, 0, 0, 0, 0,
  194.   1, 10, -1, -10, 9, 11, -9, -11,
  195.   1, 10, -1, -10, 9, 11, -9, -11,
  196.   -10, -9, -11, 0, 0, 0, 0, 0};
  197. static const INTSIZE __aligned max_steps[8] =
  198. {0, 2, 1, 7, 7, 7, 1, 2};
  199. static const INTSIZE __aligned nunmap[120] =
  200. {
  201.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  202.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  203.   -1, 0, 1, 2, 3, 4, 5, 6, 7, -1,
  204.   -1, 8, 9, 10, 11, 12, 13, 14, 15, -1,
  205.   -1, 16, 17, 18, 19, 20, 21, 22, 23, -1,
  206.   -1, 24, 25, 26, 27, 28, 29, 30, 31, -1,
  207.   -1, 32, 33, 34, 35, 36, 37, 38, 39, -1,
  208.   -1, 40, 41, 42, 43, 44, 45, 46, 47, -1,
  209.   -1, 48, 49, 50, 51, 52, 53, 54, 55, -1,
  210.   -1, 56, 57, 58, 59, 60, 61, 62, 63, -1,
  211.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  212.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
  213.  
  214. int __aligned InitFlag = false;
  215. void
  216. Initialize_moves (void)
  217.  
  218. /*
  219.  * This procedure pre-calculates all moves for every piece from every square.
  220.  * This data is stored in nextpos/nextdir and used later in the move
  221.  * generation routines.
  222.  */
  223.  
  224. {
  225.   INTSIZE ptyp, po, p0, d, di, s, delta;
  226.   unsigned char *ppos, *pdir;
  227.   INTSIZE dest[8][8];
  228.   INTSIZE steps[8];
  229.   INTSIZE sorted[8];
  230.  
  231.   for (ptyp = 0; ptyp < 8; ptyp++)
  232.     for (po = 0; po < 64; po++)
  233.       for (p0 = 0; p0 < 64; p0++)
  234.     {
  235.       nextpos[ptyp][po][p0] = (unsigned char) po;
  236.       nextdir[ptyp][po][p0] = (unsigned char) po;
  237.     }
  238.   for (ptyp = 1; ptyp < 8; ptyp++)
  239.     for (po = 21; po < 99; po++)
  240.       if (nunmap[po] >= 0)
  241.     {
  242.       ppos = nextpos[ptyp][nunmap[po]];
  243.       pdir = nextdir[ptyp][nunmap[po]];
  244.       /* dest is a function of direction and steps */
  245.       for (d = 0; d < 8; d++)
  246.         {
  247.           dest[d][0] = nunmap[po];
  248.           delta = direc[ptyp][d];
  249.           if (delta != 0)
  250.         {
  251.           p0 = po;
  252.           for (s = 0; s < max_steps[ptyp]; s++)
  253.             {
  254.               p0 = p0 + delta;
  255.  
  256.               /*
  257.                * break if (off board) or (pawns only move two
  258.                * steps from home square)
  259.                */
  260.               if ((nunmap[p0] < 0) || (((ptyp == pawn) || (ptyp == bpawn))
  261.                            && ((s > 0) && ((d > 0) || (Stboard[nunmap[po]] != pawn)))))
  262.             break;
  263.               else
  264.             dest[d][s] = nunmap[p0];
  265.             }
  266.         }
  267.           else
  268.         s = 0;
  269.  
  270.           /*
  271.            * sort dest in number of steps order currently no sort
  272.            * is done due to compability with the move generation
  273.            * order in old gnu chess
  274.            */
  275.           steps[d] = s;
  276.           for (di = d; s > 0 && di > 0; di--)
  277.         if (steps[sorted[di - 1]] == 0)    /* should be: < s */
  278.           sorted[di] = sorted[di - 1];
  279.         else
  280.           break;
  281.           sorted[di] = d;
  282.         }
  283.  
  284.       /*
  285.        * update nextpos/nextdir, pawns have two threads (capture
  286.        * and no capture)
  287.        */
  288.       p0 = nunmap[po];
  289.       if (ptyp == pawn || ptyp == bpawn)
  290.         {
  291.           for (s = 0; s < steps[0]; s++)
  292.         {
  293.           ppos[p0] = (unsigned char) dest[0][s];
  294.           p0 = dest[0][s];
  295.         }
  296.           p0 = nunmap[po];
  297.           for (d = 1; d < 3; d++)
  298.         {
  299.           pdir[p0] = (unsigned char) dest[d][0];
  300.           p0 = dest[d][0];
  301.         }
  302.         }
  303.       else
  304.         {
  305.           pdir[p0] = (unsigned char) dest[sorted[0]][0];
  306.           for (d = 0; d < 8; d++)
  307.         for (s = 0; s < steps[sorted[d]]; s++)
  308.           {
  309.             ppos[p0] = (unsigned char) dest[sorted[d]][s];
  310.             p0 = dest[sorted[d]][s];
  311.             if (d < 7)
  312.               pdir[p0] = (unsigned char) dest[sorted[d + 1]][0];
  313.  
  314.             /*
  315.              * else is already initialized
  316.              */
  317.           }
  318.         }
  319.     }
  320. }
  321.  
  322. void
  323. NewGame (void)
  324.  
  325. /*
  326.  * Reset the board and other variables to start a new game.
  327.  */
  328.  
  329. {
  330.   INTSIZE l, p;
  331.   int tmp;
  332.   char tstr[32];
  333.   INTSIZE a, r, c, sq, i, found;
  334.   int tmpcolor;
  335.   char s[16];
  336.  
  337.  if (AmigaStarted)
  338.   {
  339.    if (FirstTime)
  340.     {
  341.      FirstTime = 0;
  342.     }
  343.    else
  344.     {
  345.      if (!LoadFullBitMap())
  346.       {
  347.        ExitChess();
  348.       }
  349.      (void)SetTaskPri((struct Task *)myproc,procpri);
  350.     }
  351.   }
  352. /* SupervisorMode = 0;*/
  353.  previous_score = 0;
  354.  global_tmp_score = 0;
  355.  CheckIllegal = IllegalMove = 0;
  356.   Mate = 0;
  357.  ResignOffered = 0;
  358.  ThinkAheadDepth = ThinkAheadWorked = 0;
  359.  DrawnGame = 0;
  360.  MateString[0] = '\0';
  361.   compptr = oppptr = 0; // was -1 in 2.35
  362.   stage = stage2 = -1;        /* the game is not yet started */
  363.   flag.illegal = flag.mate = flag.quit = flag.reverse = flag.bothsides = flag.onemove = flag.force = false;
  364.   flag.material = flag.coords = flag.hash = flag.beep = flag.rcptr = true;
  365.   flag.threat = true;
  366.   flag.stars = flag.shade = flag.back = flag.musttimeout = false;
  367. #ifdef CLIENT
  368.   flag.gamein = true;
  369. #else 
  370.   flag.gamein = false;
  371. #endif
  372. #if defined(MSDOS) && !defined(SEVENBIT)
  373.   flag.rv = false;
  374. #else
  375.   flag.rv = true;
  376. #endif /* MSDOS && !SEVENBIT */
  377.  
  378.   mycnt1 = mycnt2 = 0;
  379.   GenCnt = NodeCnt = et0 = epsquare = XCmore = 0;
  380.   dither = 0;
  381.   WAwindow = WAWNDW;
  382.   WBwindow = WBWNDW;
  383.   BAwindow = BAWNDW;
  384.   BBwindow = BBWNDW;
  385.   xwndw = BXWNDW;
  386.   if (!MaxSearchDepth)
  387.     MaxSearchDepth = MAXDEPTH - 1;
  388.   contempt = 0;
  389.   GameCnt = 0;
  390.   Game50 = 1;
  391.   hint = 0x0C14;
  392.   ISZERO = 1;
  393.   ZeroRPT ();
  394.   Developed[white] = Developed[black] = false;
  395.   MouseDropped = 0;
  396.   Castled[white] = Castled[black] = 0;
  397.   myEnPassant[white] = myEnPassant[black] = 0;
  398.   castld[white] = castld[black] = false;
  399.   PawnThreat[0] = CptrFlag[0] = false;
  400.   Pscore[0] = 12000;
  401.   Tscore[0] = 12000;
  402.   opponent = white;
  403.   computer = black;
  404.   for (l = 0; l < TREE; l++)
  405.     Tree[l].f = Tree[l].t = 0;
  406.  gsrand ((unsigned int) 1);
  407. #ifndef CACHE
  408. #if ttblsz
  409.   ZeroTTable ();
  410. #endif /* ttblsz */
  411. #endif
  412. // srand ((unsigned int) 1);
  413.   if (!InitFlag)
  414.     {
  415.       for (c = white; c <= black; c++)
  416.     for (p = pawn; p <= king; p++)
  417.       for (l = 0; l < 64; l++)
  418.         {
  419.           hashcode[c][p][l].key = (((unsigned long) urand ()));
  420.           hashcode[c][p][l].key += (((unsigned long) urand ()) << 16);
  421.           hashcode[c][p][l].bd = (((unsigned long) urand ()));
  422.           hashcode[c][p][l].bd += (((unsigned long) urand ()) << 16);
  423. #ifdef LONG64
  424.           hashcode[c][p][l].key += (((unsigned long) urand ()) << 32);
  425.           hashcode[c][p][l].key += (((unsigned long) urand ()) << 48);
  426.           hashcode[c][p][l].bd += (((unsigned long) urand ()) << 32);
  427.           hashcode[c][p][l].bd += (((unsigned long) urand ()) << 48);
  428. #endif
  429.         }
  430.     }
  431.   for (l = 0; l < 64; l++)
  432.     {
  433.       board[l] = Stboard[l];
  434.       color[l] = Stcolor[l];
  435.       Mvboard[l] = 0;
  436.     }
  437.   InitializeStats ();
  438.   time0 = time ((long *) 0);
  439.   ElapsedTime (1);
  440.   flag.regularstart = true;
  441.   if (MenuStripSet)
  442.    {
  443.     MenuItem8ab.Flags |= CHECKED;
  444.     SetMenuStrip(wG,&MenuList1);    /* attach any Menu */
  445.    }
  446.   Book = BOOKFAIL;
  447.   if (!InitFlag)
  448.     {
  449.       if (TCflag)
  450.        {
  451.         strcpy(tstr,"60 10");
  452.     SelectLevel (tstr);
  453.     SetTimeControl ();
  454.        }
  455.       else if (MaxResponseTime == 0)
  456.        {
  457.         strcpy(tstr,"60 10");
  458.     SelectLevel (tstr);
  459.     SetTimeControl ();
  460.        }
  461.       UpdateDisplay (0, 0, 1, 0);
  462. /*    GetOpenings(black);*/
  463. #ifdef CACHE
  464.       Initialize_ttable();
  465. #endif
  466.       InitFlag = true;
  467.     }
  468.    else
  469.     {
  470.       if (TCflag)
  471.        {
  472.         sprintf(tstr,"%d %d",TCmoves,TCminutes);
  473.     SelectLevel (tstr);
  474.     SetTimeControl ();
  475.        }
  476.     }
  477.   GetOpenings(black);
  478.   hashbd = hashkey = 0;
  479. #ifdef AMIGA
  480.   tmp = player;
  481.   player = white;
  482.   UpdateClocks();
  483.   player = black;
  484.   UpdateClocks();
  485.   player = tmp;
  486. #endif
  487. #ifdef CACHE
  488. #if ttblsz
  489.   ZeroTTable ();
  490.   TTadd = 0;
  491. #endif /* ttblsz */
  492. #endif
  493.  if (PlayMode == 1)
  494.   {
  495.     flag.regularstart = false;
  496.     Book = 0;
  497.  
  498.       strcpy(s," g8");
  499.       a = tmpcolor = black;
  500.       c = s[1] - 'a';
  501.       r = s[2] - '1';
  502.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  503.     {
  504.       sq = locn (r, c);
  505.       color[sq] = a;
  506.       board[sq] = no_piece;
  507.       for (i = no_piece; i <= king; i++)
  508.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  509.           {
  510.         board[sq] = i;
  511.         found=1;
  512.         break;
  513.           }
  514.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  515.     }
  516.       strcpy(s," b8");
  517.       a = tmpcolor = black;
  518.       c = s[1] - 'a';
  519.       r = s[2] - '1';
  520.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  521.     {
  522.       sq = locn (r, c);
  523.       color[sq] = a;
  524.       board[sq] = no_piece;
  525.       for (i = no_piece; i <= king; i++)
  526.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  527.           {
  528.         board[sq] = i;
  529.         found=1;
  530.         break;
  531.           }
  532.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  533.     }
  534.  
  535.     if (MenuStripSet)
  536.      {
  537.       OnMenu(wG,ADVANCEDMENUNUM);
  538.       OffMenu(wG,BOOKMENUNUM);
  539.       OffMenu(wG,INTERMEDIATEMENUNUM); 
  540.       OnMenu(wG,EASYMENUNUM); 
  541.      }
  542.     GameCnt = 0;
  543.     Game50 = 1;
  544.     ISZERO = 1;
  545.     ZeroRPT ();
  546.     Sdepth = 0;
  547.     InitializeStats ();
  548.     DrawAmigaBoard();
  549.   }
  550.  else if (PlayMode == 0)
  551.   {
  552.     flag.regularstart = false;
  553.     Book = 0;
  554.  
  555.       strcpy(s," d8");
  556.       a = tmpcolor = black;
  557.       c = s[1] - 'a';
  558.       r = s[2] - '1';
  559.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  560.     {
  561.       sq = locn (r, c);
  562.       color[sq] = a;
  563.       board[sq] = no_piece;
  564.       for (i = no_piece; i <= king; i++)
  565.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  566.           {
  567.         board[sq] = i;
  568.         found=1;
  569.         break;
  570.           }
  571.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  572.     }
  573.       strcpy(s," g8");
  574.       a = tmpcolor = black;
  575.       c = s[1] - 'a';
  576.       r = s[2] - '1';
  577.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  578.     {
  579.       sq = locn (r, c);
  580.       color[sq] = a;
  581.       board[sq] = no_piece;
  582.       for (i = no_piece; i <= king; i++)
  583.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  584.           {
  585.         board[sq] = i;
  586.         found=1;
  587.         break;
  588.           }
  589.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  590.     }
  591.       strcpy(s," b8");
  592.       a = tmpcolor = black;
  593.       c = s[1] - 'a';
  594.       r = s[2] - '1';
  595.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  596.     {
  597.       sq = locn (r, c);
  598.       color[sq] = a;
  599.       board[sq] = no_piece;
  600.       for (i = no_piece; i <= king; i++)
  601.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  602.           {
  603.         board[sq] = i;
  604.         found=1;
  605.         break;
  606.           }
  607.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  608.     }
  609.  
  610.    if (MenuStripSet)
  611.     {
  612.      OnMenu(wG,ADVANCEDMENUNUM); 
  613.      OnMenu(wG,INTERMEDIATEMENUNUM); 
  614.      OffMenu(wG,EASYMENUNUM);
  615.      OffMenu(wG,BOOKMENUNUM);
  616.     }
  617.     GameCnt = 0;
  618.     Game50 = 1;
  619.     ISZERO = 1;
  620.     ZeroRPT ();
  621.     Sdepth = 0;
  622.     InitializeStats ();
  623.     DrawAmigaBoard();
  624.   }
  625.  else if (PlayMode == 2)
  626.   {
  627.     if (MenuStripSet)
  628.      {
  629.       OnMenu(wG,BOOKMENUNUM);
  630.       OffMenu(wG,ADVANCEDMENUNUM); 
  631.       OnMenu(wG,INTERMEDIATEMENUNUM); 
  632.       OnMenu(wG,EASYMENUNUM); 
  633.      }
  634.   }
  635. #ifdef HISTORY
  636. #ifdef AMIGA
  637.  ClearMem(history,sizeof(history));
  638. #else
  639.  memset(history,0,sizeof(history));
  640. #endif
  641. #endif
  642. #ifdef NODITHER
  643.   PCRASH = PCRASHS;
  644.   PCENTER = PCENTERS;
  645. #else
  646.   PCRASH = PCRASHS + dither?(rand() % PCRASHV):0;
  647.   PCENTER = PCENTERS + dither?(rand() % PCENTERV):0;
  648. #endif
  649. }
  650.  
  651. void
  652. InitConst (char *lang)
  653. {
  654.   FILE *constfile;
  655.   char s[256];
  656.   char sl[5];
  657.   int len, entry;
  658.   char *p, *q;
  659.  
  660.   constfile = fopen (LANGFILE, "r");
  661.   if (!constfile)
  662.     {
  663.      /* printf ("NO LANGFILE\n");*/
  664.       exit (1);
  665.     }
  666.   while (fgets (s, sizeof (s), constfile))
  667.     {
  668.       if (s[0] == '!')
  669.     continue;
  670.       len = strlen (s);
  671.       for (q = &s[len]; q > &s[8]; q--)
  672.     if (*q == '}')
  673.       break;
  674.       if (q == &s[8])
  675.     {
  676. /*      printf ("{ error in cinstfile\n");*/
  677.       exit (1);
  678.     }
  679.       *q = '\0';
  680.       if (s[3] != ':' || s[7] != ':' || s[8] != '{')
  681.     {
  682.     /*  printf ("Langfile format error %s\n", s);*/
  683.       exit (1);
  684.     }
  685.       s[3] = s[7] = '\0';
  686.       if (lang == NULL)
  687.     {
  688.       lang = sl;
  689.       strcpy (sl, &s[4]);
  690.     }
  691.       if (strcmp (&s[4], lang))
  692.     continue;
  693.       entry = atoi (s);
  694.       if (entry < 0 || entry >= CPSIZE)
  695.     {
  696.      /* printf ("Langfile number error\n");*/
  697.       exit (1);
  698.     }
  699.       for (q = p = &s[9]; *p; p++)
  700.     {
  701.       if (*p != '\\')
  702.         {
  703.           *q++ = *p;
  704.         }
  705.       else if (*(p + 1) == 'n')
  706.         {
  707.           *q++ = '\n';
  708.           p++;
  709.         }
  710.     }
  711.       *q = '\0';
  712.       if (entry < 0 || entry > 255)
  713.     {
  714.      /* printf ("Langfile error %d\n", entry);*/
  715.       exit (0);
  716.     }
  717.       CP[entry] = (char *) malloc ((unsigned) strlen (&s[9]) + 1);
  718.       if (CP[entry] == NULL)
  719.     {
  720.       perror ("malloc");
  721.       exit (0);
  722.     }
  723.       strcpy (CP[entry], &s[9]);
  724.  
  725.     }
  726.   fclose (constfile);
  727. }
  728.  
  729. #ifndef CACHE
  730. #ifdef ttblsz
  731. void
  732. Initialize_ttable ()
  733. {
  734.   if (rehash < 0)
  735.     rehash = MAXrehash - 1;
  736. }
  737.  
  738. #endif /* ttblsz */
  739.  
  740. #else
  741.  
  742. #ifdef ttblsz
  743. void
  744.  
  745. Initialize_ttable ()
  746. {
  747.   char astr[32];
  748.   int doit = true;
  749.   if (rehash < 0)
  750.     rehash = MAXrehash;
  751. while(doit && ttblsize > (1<<13)){
  752.   ttable[0] = (struct hashentry *)malloc((unsigned)(sizeof(struct hashentry))*(ttblsize+rehash));
  753.   ttable[1] = (struct hashentry *)malloc((unsigned)(sizeof(struct hashentry))*(ttblsize+rehash));
  754.   if(ttable[0] == NULL || ttable[1] == NULL){
  755.   if(ttable[0] != NULL)free(ttable[0]);
  756.   ttblsize = ttblsize>>1;
  757.   } else doit = false;
  758. }
  759.   if(ttable[0] == NULL || ttable[1] == NULL){ perror("memory alloc");exit(1);}
  760.   sprintf(astr,"transposition tbl is %d\n",ttblsize);
  761.   ShowMessage(astr);
  762. }
  763.  
  764. #endif /* ttblsz */
  765. #endif
  766.